“Multi-streaming” is the general name for a recent trend in Solid State Drive (SSD) development to save data using multiple data streams. In conventional applications of this technology, each stream is dedicated to a block, and each stream is assigned data based on one or more supposedly similar attributes (most commonly, an expected life span for that data). By attempting to place data with similar characteristics together in a stream (and ultimately a storage block), it is hoped that the grouped data will behave predictably, ultimately simplifying the SSD's garbage collection (GC) and reducing its associated write amplification factor (WAF). More specifically, if a block is being fed data by a stream whose data has a known life expectancy, the system may better predict when all of the data in that block will expire (and at what rate), making the task of locating victim blocks for garbage collection and transferring their valid data easier.
Unfortunately, there are problems with this basic approach. First, in many cases, the lifespan of data within a stream may only be approximated. This means that in many cases, data behaving differently from the approximation will violate the timing assumptions of a multi-streaming system, and garbage collection/write amplification factor performance will suffer. Second, the properties of data streams may change with time. Thus, the original timing assumptions made with regard to multi-stream control will be violated, again resulting in poor garbage collection/write amplification factor performance. Finally, for reasons outside of the control of the multi-stream system (e.g., a full disk), sometimes garbage collection must be performed on a multi-streamed block before all data has expired. In this case, despite a traditional multi-streaming system's best efforts, valid data from a victim block must still be re-written elsewhere (called “programming”).
A need remains for a way to improve the performance of an SSD.